#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#define N 4 // 消费者或者生产者的数目
#define M 20 // 缓冲数目
int in = 0; // 生产者放置产品的位置
int out = 0; // 消费者取产品的位置
char buff[M]; // 缓冲区
int producter_id = 0; //生产者 id
int consumer_id = 0; //消费者 id
sem_t empty_sem;
sem_t full_sem;
pthread_mutex_t mutex;
/* 打印缓冲情况 */
void print()
{
int i;
for(i = 0; i < M; i++)
printf("%c ", buff[i]);
printf("\n");
}
/* 生产者方法 */
void *producter(void *)
{
int id = ++producter_id;
while(1)
{
// 用 sleep 的数量可以调节生产和消费的速度
sleep(2);
sem_wait(&empty_sem);
pthread_mutex_lock(&mutex);
char data;
data=rand()%26+65; 
in = in % M;
printf("生产者进程%d 在%2d 位置产生数据%c: ", id,in,data); 
buff[in] = data; 
print(); 
++in;
pthread_mutex_unlock(&mutex);
sem_post(&full_sem);
}
}
/* 消费者方法 */
void *consumer(void *)
{
char data;
int id = ++consumer_id;
while(1)
{
// 用 sleep 的数量可以调节生产和消费的速度
sleep(1);
sem_wait(&full_sem);
pthread_mutex_lock(&mutex);
out = out % M;
data=buff[out];
printf("消费者进程%d 在%2d 位置消费数据%c: ",id, out,data); 
buff[out] = '*';
print();
++out;
pthread_mutex_unlock(&mutex);
sem_post(&empty_sem);
}
}
int main()
{
sem_init ( &empty_sem,0, 20);
sem_init (&full_sem, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_t p[N];
pthread_t c[N];
int i;
int ret[N];
for(i=0; i<M; i++)
buff[i]='*'; //'*'表示空,初始化缓冲区
srand((int)time(NULL));
// 创建 N 个生产者线程
for (i = 0; i < N; i++)
{
ret[i] = pthread_create(&p[i], NULL,&producter, (void *)(&i));
if(ret[i] != 0)
{
printf("producter %d creation failed \n", i);
exit(1);
}
}
//创建 N 个消费者线程
for(i = 0; i < N; i++)
{
ret[i] = pthread_create(&c[i], NULL,&consumer, NULL);
if(ret[i] != 0)
{
printf("consumer %d creation failed\n", i);
exit(1);
}
}
//销毁线程
for(i = 0; i < N; i++)
{
pthread_join(p[i],NULL);
pthread_join(c[i],NULL);
}
system("pause");
exit(0);
}